package es.deusto.ingenieria.tesoroaventurero;

import es.deusto.ingenieria.is.formulation.Operator;
import es.deusto.ingenieria.is.formulation.State;

public class Mover extends Operator{

	public enum Sentido {
		ARRIBA,
		ABAJO,
		IZQUIERDA,
		DERECHA
	}
	
	private Sentido sentido;
	
	public Mover(Sentido sentido) {
		super("Mover-"+sentido);
		this.sentido = sentido;
	}
	
	protected boolean isApplicable(State state) {
		Escenario escenario = (Escenario)state.getInformation();

		switch(this.sentido) {
		case ARRIBA:
			return escenario.getPersonaje().y > 0 &&
			!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isArriba();
		case ABAJO:
			return escenario.getPersonaje().y < escenario.getCasillas().length - 1 &&
			!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isAbajo();
		case IZQUIERDA:
			return escenario.getPersonaje().x > 0 && 
			!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isIzquierda();
		case DERECHA:
			return escenario.getPersonaje().x < escenario.getCasillas()[0].length - 1 && 
			!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isDerecha();
		}
		return false;
	}

	protected State effect(State state) {
		Escenario escenario = (Escenario)state.getInformation();
		Escenario newEscenario = escenario.clone();
		
		switch(this.sentido) {
		case ARRIBA:
			newEscenario.getPersonaje().y--;
			break;
		case ABAJO:
			newEscenario.getPersonaje().y++;
			break;
		case IZQUIERDA:
			newEscenario.getPersonaje().x--;
			break;
		case DERECHA:
			newEscenario.getPersonaje().x++;
			break;
		}
		
		if (newEscenario.getCasilla(newEscenario.getPersonaje().x, newEscenario.getPersonaje().y).isGema()) {
			newEscenario.getCasilla(newEscenario.getPersonaje().x, newEscenario.getPersonaje().y).setGema(false);
		}
		
		return new State(newEscenario);
	}
}
